// js/managers/UserManager.js

export default class UserManager {
  constructor(api) {
    this.api = api
    this.openId = null;
    this.sessionKey = null;
    this.isLoggedIn = false;
  }

  /**
   * 用户登录流程
   * @returns {Promise<boolean>} 返回登录是否成功
   */
  async login() {
    try {
      // 1. 先检查本地是否已有缓存的 openId
      const cachedOpenId = wx.getStorageSync('openId');
      if (cachedOpenId) {
        this.openId = cachedOpenId;
        this.isLoggedIn = true;
        return true;
      }

      // 2. 调用微信登录接口获取 code
      const loginRes = await this.wxLogin();
      const code = loginRes.code;
      console.log('[UserManager] Got wx.login code:', code);

      if (!code) {
        throw new Error('Failed to get wx.login code.');
      }

      // 3. 将 code 发送到你的后端服务器，换取 openId 和 sessionKey
      // !!! 重要：这里你需要替换成你自己的后端API地址 !!!
      const { openid, session_key } = await this.fetchSessionFromServer(code);

      // 4. 保存到本地和实例属性中
      this.openId = openid;
      this.sessionKey = session_key;
      this.isLoggedIn = true;

      wx.setStorageSync('openId', openid);
      wx.setStorageSync('sessionKey', session_key);

      return true;
    } catch (error) {
      console.error('[UserManager] Login failed:', error);
      this.isLoggedIn = false;
      // 可以在这里处理登录失败的情况，比如引导用户重试
      return false;
    }
  }

  /**
   * 封装 wx.login 为 Promise
   */
  wxLogin() {
    return new Promise((resolve, reject) => {
      wx.login({
        success: resolve,
        fail: reject
      });
    });
  }

  /**
   * 模拟向后端发送 code 请求 session
   * !!! 你需要将此方法替换为真实的网络请求，例如使用 wx.request !!!
   * @param {string} code 
   * @returns {Promise<{openId: string, sessionKey: string}>}
   */
  async fetchSessionFromServer(code) {
    let response = null
    // 调用你的后台接口，用 code 换取自定义登录态（openid）
    await this.api.user.login(code).then(res => {
      response = JSON.parse(res.data)
    }).catch(err => {
      console.error('登录失败:', err);
    });
    return response
  }

  /**
   * 获取当前用户的 openId
   * @returns {string | null}
   */
  getOpenId() {
    return this.openId;
  }

  /**
 * 获取当前用户的信息
 * @returns {string | null}
 */
  getUserData() {
    const userData = wx.getStorageSync('userData');
    return userData;
  }


  /**
* 重新从服务器获取当前用户的最新信息
* @returns {string | null}
*/
  async refreshUserData() {
    const userProfile = await this.api.user.getUserProfile();
    wx.setStorageSync('userData', userProfile.data);
    wx.setStorageSync('userBalance', userProfile.data.balance);
  }

  /**
* 获取当前用户的信息
* @returns {string | null}
*/
  getUserBalance() {
    const userBalance = wx.getStorageSync('userBalance');
    return userBalance;
  }


  /**
   * 检查用户是否已登录
   * @returns {boolean}
   */
  isUserLoggedIn() {
    return this.isLoggedIn;
  }
}
